% Назначение: Вернуть текущее расстояние решетчатого кода
% Вход: trel    - структура описывающая таблицу переходов используемого
%                 свёрточного кода
%       signals - множество сигнальных точек модуляции
%       s       - текущее состояние
%       i       - возможные выходы из текущего состояния
%       df      - прошлое расстояние решетчатого кода
%       limDf   - граничное значение расстояния данного решетчатого кода
% Выход: df - текущее расстояние решетчатого кода
% Обращение: df = getDf(trel, signals, s, i, df, limDf)
function df = getDf(trel, signals, s, i, df, limDf)
ind = find( trel.nextStates(s+1, i) == 0, 2 ); % найти можно ли попасть в 0
                                               % состояние из данного

if ~isempty(ind) % можно попасть в 0 состояние
    outS = signals(  :, trel.outputs( s+1, i(ind) ) + 1  ); % возможные 
                                                            % выходные
                                                            % сигналы
    d    = pdist2(outS', signals( :, trel.outputs(1, 1) + 1 )', 'euclidean');      % Евклидова
                                                            % метрика до 
                                                            % сигнала 0
    d    = df + min(d);                                     % минимальное 
                                                            % расстояние до
                                                            % состояния 0
    if d < limDf
        limDf  = d;
    end
    i(ind) = []; % удалить уже просмотренные выходы
end

if ~isempty(i) % расстояние по остальным выходам
    outS   = signals( :, trel.outputs(s+1, i) + 1 );     % возможные
                                                         % выходные сигналы
    d      = pdist2(outS', signals( :, trel.outputs(1, 1) + 1 )', 'euclidean'); % Евклидова метрика
                                                         % до сигнала 0
    [d, j] = min(d);
    d      = df + d;                                     % минимальное
                                                         % расстояние до 
                                                         % состояния 0
    
    if d < limDf
        o_df = d + getDf(trel, signals, trel.nextStates( s+1, i(j) ),...
                         (1 : trel.numInputSymbols), d, limDf);
        if o_df < limDf
            limDf = o_df;
        end
    end
end

df = limDf;
end
